package com.aiwiown.snackmq.api;

import com.aiwiown.snackmq.common.message.Message;

/**
 * 顺序消息监听器接口。
 * <p>
 * 业务方实现此接口来顺序处理同一个分区内的消息。
 * 当使用此监听器订阅主题时，SnackMQ客户端将保证每个分区内的消息
 * 被严格地按顺序、由单个线程进行消费。
 *
 * @see com.aiwiown.snackmq.api.Consumer#subscribe(String, OrderedMessageListener)
 */
public interface OrderedMessageListener {
    /**
     * 顺序消费消息。
     * <p>
     * <b>重要:</b>
     * <ul>
     *     <li>当返回 {@link ConsumeResult#SUCCESS} 时，客户端才会处理该分区的下一条消息。</li>
     *     <li>当返回 {@link ConsumeResult#RETRY} 时，客户端将阻塞当前分区的消费，并在稍后重试当前消息。在重试成功前，后续消息不会被消费。</li>
     * </ul>
     *
     * @param message 接收到的消息
     * @return 消费结果
     */
    ConsumeResult consume(Message message);
}